﻿using Onshi.POS.Formularios.Properties;
using Onshi.POS.Formularios.Recursos;
using Onshi.POS.Modelo.Entidades;
using Onshi.POS.Modelo.Entidades.Tipos;
using Onshi.POS.Modelo.Enumeradores;
using Onshi.POS.Proveedores;
using Onshi.POS.Proveedores.Vistas;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Configuration;

namespace Onshi.POS.Formularios
{
    public partial class RubrosProveedores : FormularioBase, IRubrosProveedores
    {
        #region Constructores

        public RubrosProveedores(Boolean esBusqueda)
        {
            CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();
            btnSeleccionar.Visible = esBusqueda;
            presentador = new RubrosProveedoresPresentador(this);
            procesando = new Procesando();
        }

        #endregion

        #region Atributos

        private Boolean inicializando = true;
        private RubrosProveedoresPresentador presentador;
        private Int32 idRubroProveedor;
        private enum MetodoHilo { Inicializar, Actualizar, Aceptar, Eliminar };

        #endregion

        #region Propiedades

        public Int32 IdRubroProveedorSeleccionado
        {
            get { return idRubroProveedor; }
        }

        [Browsable(false)]
        public Int32 IdUsuarioSistema
        {
            get { return Principal.IdUsuarioSistema; }
        }

        [Browsable(false)]
        public Int32 IdRubroProveedor
        {
            get { return idRubroProveedor; }
        }

        [Browsable(false)]
        public String Nombre
        {
            get { return txtNombre.Text; }
        }

        [Browsable(false)]
        public String NombreFiltro
        {
            get { return txtNombreFiltro.Text; }
        }

        [Browsable(false)]
        public String Observaciones
        {
            get { return txtObservaciones.Text; }
        }

        [Browsable(false)]
        public List<RubroProveedor> ListadoRubrosProveedores
        {
            set { bsRubrosProveedores.DataSource = new SortableList<RubroProveedor>(value); }
        }

        [Browsable(false)]
        public EnumSiNo ObservacionesFiltro
        {
            get { return (EnumSiNo)((Byte)cboObservacionesFiltro.SelectedValue); }
        }

        #endregion

        #region Metodos

        private void ActualizarCampos()
        {
            if (bsRubrosProveedores.Current != null)
            {
                idRubroProveedor = ((RubroProveedor)bsRubrosProveedores.Current).Id;
                txtNombre.Text = ((RubroProveedor)bsRubrosProveedores.Current).Nombre;
                txtObservaciones.Text = ((RubroProveedor)bsRubrosProveedores.Current).Observaciones;
            }
            else
                LimpiarCampos();
        }

        private void LimpiarFiltro()
        {
            inicializando = true;
            txtNombreFiltro.Text = String.Empty;
            cboObservacionesFiltro.SelectedValue = (Byte)EnumSiNo.Todos;
            inicializando = false;
        }

        private void LimpiarCampos()
        {
            errRubrosProveedores.Clear();
            idRubroProveedor = 0;
            txtNombre.Text = String.Empty;
            txtObservaciones.Text = String.Empty;
        }

        private void HabilitarControles(Boolean habilitar)
        {
            txtNombre.Enabled = habilitar;
            txtObservaciones.Enabled = habilitar;
            btnNuevo.Enabled = !habilitar;
            btnModificar.Enabled = !habilitar;
            btnEliminar.Enabled = !habilitar;
            btnAceptar.Enabled = habilitar;
            btnCancelar.Enabled = habilitar;
            navRubrosProveedores.Enabled = !habilitar;
            if (!habilitar)
                ValidarControles();
        }

        private void ValidarControles()
        {
            if (bsRubrosProveedores.Current != null)
            {
                btnSeleccionar.Enabled = true;
                if (((RubroProveedor)bsRubrosProveedores.Current).Id == (Int32)EnumRubrosProveedores.RubroUnico)
                {
                    btnModificar.Enabled = false;
                    btnEliminar.Enabled = false;
                }
                else
                {
                    btnModificar.Enabled = true;
                    btnEliminar.Enabled = true;
                }
            }
            else
            {
                idRubroProveedor = 0;
                btnSeleccionar.Enabled = false;
                btnModificar.Enabled = false;
                btnEliminar.Enabled = false;
            }
        }

        private void Filtrar()
        {
            if (!inicializando)
                presentador.Filtrar();
        }

        #endregion

        #region Eventos

        #region Filtro

        private void txtNombreFiltro_TextChanged(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void cboObservacionesFiltro_SelectionChangeCommitted(Object sender, EventArgs e)
        {
            Filtrar();
        }

        #endregion

        private void RubrosProveedores_Load(Object sender, EventArgs e)
        {
            solRubrosProveedores.SelectedTab = tabDetalle;
            solRubrosProveedores.SelectedTab = tabListado;
            grdRubrosProveedores.ScrollBars = ScrollBars.None;
            bgwRubrosProveedores.RunWorkerAsync(MetodoHilo.Inicializar);
            procesando.ShowDialog();
        }

        private void btnNuevo_Click(Object sender, EventArgs e)
        {
            LimpiarCampos();
            HabilitarControles(true);
            txtNombre.Focus();
        }

        private void btnModificar_Click(Object sender, EventArgs e)
        {
            HabilitarControles(true);
            txtNombre.Focus();
        }

        private void btnEliminar_Click(Object sender, EventArgs e)
        {
            if (MessageBox.Show("Los proveedores de que posean este rubro de proveedor se actualizarán con el predeterminado" + Environment.NewLine + "¿Está seguro que desea eliminar el rubro de proveedor?", ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
            {
                bgwRubrosProveedores.RunWorkerAsync(MetodoHilo.Eliminar);
                procesando.ShowDialog();
            }
        }

        private void btnAceptar_Click(Object sender, EventArgs e)
        {
            var validado = true;
            errRubrosProveedores.Clear();
            if (String.IsNullOrWhiteSpace(txtNombre.Text))
            {
                validado = false;
                errRubrosProveedores.SetError(txtNombre, "El nombre no puede quedar vacío");
            }
            if (validado)
            {
                bgwRubrosProveedores.RunWorkerAsync(MetodoHilo.Aceptar);
                procesando.ShowDialog();
            }
        }

        private void btnCancelar_Click(Object sender, EventArgs e)
        {
            LimpiarCampos();
            HabilitarControles(false);
            ActualizarCampos();
        }

        private void btnActualizar_Click(Object sender, EventArgs e)
        {
            bgwRubrosProveedores.RunWorkerAsync(MetodoHilo.Actualizar);
            procesando.ShowDialog();
        }

        private void btnSeleccionar_Click(Object sender, EventArgs e)
        {
            idRubroProveedor = ((RubroProveedor)bsRubrosProveedores.Current).Id;
            DialogResult = DialogResult.OK;
        }

        private void btnSalir_Click(Object sender, EventArgs e)
        {
            Close();
        }

        private void btnLimpiar_Click(Object sender, EventArgs e)
        {
            LimpiarFiltro();
            presentador.Filtrar();
        }

        private void solRubrosProveedores_Selecting(Object sender, TabControlCancelEventArgs e)
        {
            if (solRubrosProveedores.SelectedTab == tabDetalle)
                ActualizarCampos();
            else
                if (!navRubrosProveedores.Enabled)
                    e.Cancel = true;
        }

        private void grdRubrosProveedore_CellFormatting(Object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (bsRubrosProveedores.Count > 0 && bsRubrosProveedores.Count == grdRubrosProveedores.RowCount)
                if (grdRubrosProveedores.Columns[e.ColumnIndex].Index == colObservaciones.Index)
                    if (((RubroProveedor)bsRubrosProveedores.List[e.RowIndex]).Observaciones != String.Empty)
                        e.Value = Properties.Resources.page_copy;
        }

        private void grdRubrosProveedores_CellClick(Object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1)
                if (bsRubrosProveedores.Current != null && e.ColumnIndex == colDetalle.Index)
                {
                    var rubrosProveedoresDetalle = new RubrosProveedoresDetalle(((RubroProveedor)bsRubrosProveedores.Current).Id);
                    rubrosProveedoresDetalle.ShowDialog();
                }
        }

        private void bgwRubrosProveedores_DoWork(Object sender, DoWorkEventArgs e)
        {
            try
            {
                switch ((MetodoHilo)e.Argument)
                {
                    case MetodoHilo.Inicializar:
                        presentador.Inicializar();
                        cboObservacionesFiltro.Actualizar();
                        break;
                    case MetodoHilo.Actualizar:
                        presentador.Actualizar();
                        break;
                    case MetodoHilo.Aceptar:
                        presentador.Aceptar();
                        LimpiarCampos();
                        HabilitarControles(false);
                        ActualizarCampos();
                        solRubrosProveedores.SelectedTab = tabListado;
                        break;
                    case MetodoHilo.Eliminar:
                        presentador.Eliminar();
                        solRubrosProveedores.SelectedTab = tabListado;
                        break;
                }
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException(ex.Message);
            }
        }

        private void bgwRubrosProveedores_RunWorkerCompleted(Object sender, RunWorkerCompletedEventArgs e)
        {
            inicializando = false;
            procesando.Close();
            if (e.Error != null)
                MessageBox.Show(e.Error.Message, ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.OK, MessageBoxIcon.Information);
            else
                actRubrosProveedores.Actualizar();
            grdRubrosProveedores.ScrollBars = ScrollBars.Both;
        }

        private void bsRubrosProveedores_PositionChanged(Object sender, EventArgs e)
        {
            if (solRubrosProveedores.SelectedTab == tabDetalle)
                ActualizarCampos();
        }

        private void grdRubrosProveedores_SelectionChanged(Object sender, EventArgs e)
        {
            ValidarControles();
        }

        #endregion
    }
}